<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>
        /* 作用域： 指一个变量的作用范围 
            1.全局作用域
                script标签中的js代码，都在全局作用域中； 页面打开时创建，关闭时销毁
                全局作用域中有一个window全局对象，它代表浏览器窗口，由浏览器创建；
                在全局作用域中
                创建的变量，会作为window对象的属性保存；创建的函数，会作为window对象的方法保存
       */
        var a = 123;

        function foo() {
            console.log("foo执行");
        }
        console.log(window.a);
        console.log(window.foo());

        /*   变量的声明提前： 
                var声明的变量，会在所以代码执行之前声明
         */
        console.log(b); // 
        var b = 123;

        /* 函数声明提前：
            函数声明形式创建的函数，会在所有代码执行前创建，可以在函数声明前调用
            函数表达式创建的函数，不会被声明提前
         */
        fun1(); // 不会报错
        // fun2(); // 会报错

        function fun1() { // 声明式函数
            console.log("执行了fun1");
        }

        var fun2 = function () { // 表达式函数
            console.log("执行了fun2");
        }


        /* 函数作用域：
                函数执行时创建，函数执行完时销毁
                全局作用域无法访问函数作用域中的变量，反之可以
         */

        var c = 123;
        var d = 90;

        function fun3() {
            var c = 234;

            function fun4() {
                console.log(c); // 从自身作用域，一级一级往上找 变量 c
                console.log(window.c); // window.c  是全局的
                console.log(a); // 变量提前声明
                var a = 222;
                d = 91;
            }
            fun4();
        }
        fun3();
        console.log(d); //91 :  函数中不使用var，则为全局变量
    </script>
</body>

</html>